package com.fy.service.service;

import com.fy.common.entity.SkImChatSession;
import com.fy.common.model.im.MessageModel;
import com.fy.common.model.im.UserOnlineStatus;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;

import java.util.List;

/**
 * im消息下发业务
 */
public interface ImBrokerService {

    /**
     * 单聊消息多端推送业务
     * @param messageModel
     */
    void sendSingleMessage(MessageModel messageModel);

    /**
     * 根据message对象中的from 和 to 获取所有在线需要推送通知的设备
     * @param messageModel
     * @return
     */
    List<UserOnlineStatus> getAllPushDevices(MessageModel messageModel);

    /**
     * 获取发送方的设备信息
     * @param messageModel
     * @return
     */
    List<UserOnlineStatus> getFromPushDevices(MessageModel messageModel);
    /**
     * 获取接收方的设备信息
     * @param messageModel
     * @return
     */
    List<UserOnlineStatus> getToPushDevices(MessageModel messageModel);

    /**
     * 修改对方的会话列表中的最后一条消息 和未读消息数
     * @param messageModel
     * @return
     */
    void updateToSessionLastMessage(MessageModel messageModel, SkImChatSession session);




    /**
     * 修改自己的会话列表信息
     * @param messageModel
     * @param session
     */
    void updateFromSessionLastMessage(MessageModel messageModel, SkImChatSession session);


    void updateSingleChatSession(MessageModel messageModel);

    /**
     * 正在输入业务
     * @param messageModel
     */
    void sendTyping(MessageModel messageModel);

    void push(MessageModel message, Channel ctx)  throws Exception;

    //根据协议类型推送到客户端
    void push(MessageModel message,ChannelHandlerContext ctx)  throws Exception;

    /**
     * 对指定目标的用户发起在线推送 MessageModel 中的 token 填发送方用户的token
     * 不同的业务定义好不同的 cmd
     * @param messageModel
     * @param targets
     * @param isSendMyself 是否需要发送给自己的其他设备
     */
    void commonAddressingMessage(MessageModel messageModel,List<Long> targets,Boolean isSendMyself);

    /**
     * 发送消息给我的其他设备 多端同步 fromId 和 deviceCode  tenantId
     * 不同的业务定义好不同的 cmd
     * @param messageModel
     */
    void sendToMyOtherDevice(MessageModel messageModel);

    /**
     * 消息撤回 - 单聊
     * @param messageModel
     */
    void sendRecall(MessageModel messageModel);

    /**
     * 消息已读 - 单聊(群聊的已读不需要推送给对方)
     * @param messageModel
     */
    void readMessage(MessageModel messageModel);

    /**
     * 恢复被删除的session
     * @param messageModel
     */
    void recoverSession(SkImChatSession messageModel);

    //获取用户在线设备
    List<UserOnlineStatus> getOnlineDevice(String tenantId,Long userId);

}
